{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "0b37b013",
   "metadata": {},
   "outputs": [],
   "source": [
    "import os\n",
    "os.environ[\"KMP_DUPLICATE_LIB_OK\"]=\"TRUE\"\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "import matplotlib.pyplot as plt\n",
    "from torch.autograd import Variable"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9a4506d1",
   "metadata": {},
   "outputs": [],
   "source": [
    "#超参数\n",
    "input_size = 1\n",
    "output_size = 1\n",
    "num_epochs = 1000\n",
    "learning_rate = 0.001"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "89ac3bed",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "e6184f96",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([100, 1])\n"
     ]
    }
   ],
   "source": [
    "x_train = torch.rand(100)\n",
    "x_train = x_train*2 -1\n",
    "x_train = x_train.unsqueeze(1)\n",
    "print(x_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "d647840f",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "torch.Size([100, 1])\n"
     ]
    }
   ],
   "source": [
    "y_train = x_train*5+8\n",
    "rand_tensor = torch.rand_like(y_train)  #生成形状与y_train一样的随机数张量 \n",
    "y_train = y_train + rand_tensor\n",
    "print(y_train.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "84a58e81",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<function matplotlib.pyplot.show(close=None, block=None)>"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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ory8PL/t5s2bJ7vd7vnp27dvDHsJAEhkJ/TvoWA5uWm2lnatjSjKlyMveEDzzKpvPVNI4ebnIHRJEcw0NTXpoosuksvl0gMPPBCw7axZs+R0Oj0/W7ZsiVEvAQAdLdLck08271awU1ympV1r6Wk2XTwieHpDbV2jJ98m3PwchC7h68w0NTXpwgsvVHV1td56662AozKSlJWVpaysrBj1DgAQK75yT/K7ZeqC4ws1tthhqehduDkzkjSgV05I50byWQhNQgcz7kDmq6++0ttvv62ePXvGu0sAgDhw5560HVTZte+gHv1gkx79YJOlpNpwc19CObd3braaXUY76hstt0dk4jrNtHfvXq1du1Zr166VJFVXV2vt2rX69ttvdejQIf30pz/V6tWr9fTTT6u5uVm1tbWqra3VwYPWykgDAJKf1RovNRaSasPJfWl9boE92++O2Ta1rFLave+gTp3/lv64/LOAn+FuT5XgyMU1mFm9erWGDx+u4cOHS5Kuv/56DR8+XLfccou+++47vfzyy/ruu+90/PHHq6CgwPOzcuXKeHYbABBDVmu8uAVKqg0n96X1ubMnFEtSu4DG/XrisAJdvYgqwbEW12mmM844Q8b4j7UDvQcA6BxCySlpnVQ7aqDv1IRQc19aKysp0IKppe1ydxz2bN183nH64/LPLFcJps5M9CR0zgwAAOHklAQKgMKtNeM2ttih3OwMVWzcKclo1FG9NHJgz5CqBF86uogRmSgimAEAJDR3rkqts8HSqIcUOGAJdr1AO177WlG1uHKrZk8oVuMhl6W++aoSjMgkRZ0ZAEDnFShXpS0rSbVWcl985bIEq+a7acf+IL1rweql6COYAQAkPHeuisPuPxAIJanW3/X87XhtpZrvsx9/K0deVtDVTqxeij6mmQAASaGspEBjix1aVb1Lb1bVaunardq1r8nzfqhJta2vt72+Qb1zs/0W3rNazfe6MYN0z5tfySZ5BT6sXupYBDMAgKSRnmbTqIE9NWpgT/1/5xVbCkSsXC8YqyuqBvTq5ne1E6uXOg7BDAAgKVkNRKIhlBVQowb2tDzig+ggmAEAIIhQV0DFMtACCcAAAAQV7gooxAbBDAAAFoS6AgqxwzQTACClNLtMh+WrhLICCrFDMAMASBkrNtRozsufqrau0XPMkZelOROHRG3khHyYxMM0EwAgJazY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ru+//z7oee+9954uvfRS/eQnP9HQoUPlcDi0adMmrza7du3SpZdeqptuukmXXXaZpkyZogMHDvi9ps1m0+jRo1VeXq41a9YoMzNTS5cujfQWAcQY00wAYuqmm26S0+nU3/72Nx122GF69dVXdfnll+sf//hHwPOOPvpoLVmyRBMmTJDNZtPNN98sl8vl1eaqq65S37599Yc//EEHDx5UaWmpfvvb3+r+++9vd72PPvpI//znPzVu3Dj17t1bH330kX744Qcdd9xxUb1fAB2PkRkAMfPOO+/onnvu0VNPPaW8vDylpaXpqaee0vvvv68FCxYEPPfuu+9Wjx49dMopp2jChAk655xzVFpa6nn/ySef1CuvvKKnnnpKXbp0UU5Ojp5++mn97//+r1555ZV218vLy9O7776rc889V8ccc4z+8Ic/6M4779T48eOjft8AOharmQAAQFJjZAYAACQ1ghkACWHIkCE67LDDfP48/fTT8e4egATGNBOAhLB582Y1NTX5fK9Pnz7Kzc2NcY8AJAuCGQAAkNSYZgIAAEmNYAYAACQ1ghkAAJDUCGYAAEBSI5gBAABJjWAGAAAkNYIZAACQ1AhmAABAUvv/ATJ3FMiMz1tqAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure()#画图\n",
    "plt.scatter(x_train,y_train)\n",
    "plt.xlabel(\"x_axis\")\n",
    "plt.ylabel(\"y_axis\")\n",
    "plt.show"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "6374017b",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "LinearRegression(\n",
      "  (linear): Linear(in_features=1, out_features=1, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "#建立回归模型\n",
    "class LinearRegression(nn.Module):\n",
    "    def __init__(self,input_size,output_size):\n",
    "        super(LinearRegression,self).__init__()\n",
    "        self.linear = nn.Linear(input_size,output_size)\n",
    "    def forward(self, x):\n",
    "        out = self.linear(x)\n",
    "        return out\n",
    "    \n",
    "#实例化\n",
    "model = LinearRegression(input_size,output_size).cuda()\n",
    "print(model)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "eeb71f2a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "cuda:0\n"
     ]
    }
   ],
   "source": [
    "#损失函数\n",
    "criterion = nn.MSELoss()#均方误差函数\n",
    "#优化函数\n",
    "optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)#随机梯度下降算法SGD\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "print(device)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "7c1519c7",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch[500/1000],loss:15.9546\n",
      "Epoch[1000/1000],loss:3.7821\n",
      "Epoch[1500/1000],loss:1.3490\n",
      "Epoch[2000/1000],loss:0.6304\n",
      "Epoch[2500/1000],loss:0.3408\n",
      "Epoch[3000/1000],loss:0.2065\n",
      "Epoch[3500/1000],loss:0.1414\n",
      "Epoch[4000/1000],loss:0.1094\n",
      "Epoch[4500/1000],loss:0.0936\n",
      "Epoch[5000/1000],loss:0.0858\n",
      "Epoch[5500/1000],loss:0.0819\n",
      "Epoch[6000/1000],loss:0.0800\n",
      "Epoch[6500/1000],loss:0.0791\n",
      "Epoch[7000/1000],loss:0.0786\n",
      "Epoch[7500/1000],loss:0.0784\n",
      "Epoch[8000/1000],loss:0.0783\n",
      "Epoch[8500/1000],loss:0.0782\n",
      "Epoch[9000/1000],loss:0.0782\n",
      "Epoch[9500/1000],loss:0.0782\n",
      "Epoch[10000/1000],loss:0.0782\n"
     ]
    }
   ],
   "source": [
    "#训练模型\n",
    "for epoch in range(num_epochs*10):\n",
    "    #NumPy转化成Tensor\n",
    "    #加载到gpu\n",
    "    inputs  = x_train.to(device)\n",
    "    targets = y_train.to(device)\n",
    "    \n",
    "    #前向传播\n",
    "    optimizer.zero_grad()  #梯度归零\n",
    "    outputs = model(inputs)\n",
    "    #反向传播\n",
    "    loss = criterion(outputs, targets)\n",
    "    loss.backward()\n",
    "    #优化\n",
    "    optimizer.step()\n",
    "    #更新参数\n",
    "    if(epoch+1)%500 == 0:\n",
    "        print('Epoch[%d/%d],loss:%.4f' %(epoch+1,num_epochs,loss.item()))#隔50个epoch打印一次结果"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "2220468e",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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McLjHn7++WePPpH0XQph/D5PnTolhg4dKtavXy+++uorsXPnTjFgwADRt29fj37h/D5fe+01ERcXJ1asWCEOHTokZsyYIZo3by5++OEH1f7ff/+9aNasmZgxY4Y4dOiQWLFihYiLixMbN2509dmxY4ewWq1i4cKF4ssvvxQLFy4UjRs3Fp9++mlI7kmN0fucMWOGyMvLE7t27RLffPONmDt3roiLixP79u1z9Vm1apVo1aqV4nc2nIze57Zt2wQA8fXXX3vcg/vvWCx8n6dOnfK4v5KSEpGUlCQef/xxV59I+z7/9a9/iYcfflhs2rRJABCvv/66z/6R8rsZ8cGHbNWqVbqCj5qaGpGcnCwWL17sajt//rxITEwUL730khBC+gsWFxcnXnvtNVef0tJS0ahRI7F161bTr92XQ4cOCQAeX+rOnTsFAPHVV1/pPs/YsWPFdddd59E2ePBgMWPGDLMutV4Cvc8pU6aIsWPHar4fSd+lEOZ9n7t27RIAPP4jGc7vs3///mL69Okebd26dRNz5sxR7f/QQw+Jbt26ebTdfffdYuDAga7X48aNEyNGjPDoM3z4cDF+/HiTrto4o/ep5vLLLxfz5893vdb7365QMnqfcvDxyy+/aJ4zFr/P119/XVgsFlFcXOxqi8TvU6Yn+IiU382In3YxqqioCMeOHcOwYcNcbQkJCRg8eDB27NgBANi7dy+qq6s9+qSmpqJnz56uPqGyc+dOJCYmYsCAAa62gQMHIjExUfe1/PTTT9iyZQvuvPNOxXuvvvoq2rZtix49euDBBx907RocavW5z4KCArRv3x6//vWvMW3aNJSVlbnei6TvEjDn+wSA8vJyWCwWxVRjOL7PCxcuYO/evR7/jgFg2LBhmve0c+dORf/hw4djz549qK6u9tknHN8bENh9equpqUFlZSWSkpI82k+fPo1OnTohPT0do0ePxv79+027bqPqc599+vRBSkoKhgwZgm3btnm8F4vf58qVKzF06FB06tTJoz2Svk+jIuV3M+I2lquvY8eOAQA6dOjg0d6hQwf88MMPrj7x8fG45JJLFH3k40Pl2LFjaN++vaK9ffv2uq9lzZo1aNmyJex2u0f7pEmT0LlzZyQnJ+OLL77A3LlzceDAAbz33numXLsRgd7nyJEjccstt6BTp04oKirCo48+iuuuuw579+5FQkJCRH2XgDnf5/nz5zFnzhxMnDjRY9OncH2fJ06cgNPpVP2d0rqnY8eOqfa/ePEiTpw4gZSUFM0+4fjegMDu09tf/vIXnDlzBuPGjXO1devWDatXr0avXr1QUVGBZcuW4eqrr8aBAwfQpUsXU+9Bj0DuMyUlBcuXL0ffvn1RVVWFv//97xgyZAgKCgpw7bXXAtD+zqP1+zx69CjefvttrF271qM90r5PoyLldzMswce8efMwf/58n312796Nfv36BfwZFovF47UQQtHmTU8fvfTeI6C8VqPX8vLLL2PSpElo0qSJR/u0adNc/9yzZ0906dIF/fr1w759+3DllVfqOrc/wb7PW2+91fXPPXv2RL9+/dCpUyds2bJFEWwZOa9Rofo+q6urMX78eNTU1OCFF17weC8U36cvRn+n1Pp7twfyexpsgV7TunXrMG/ePLz55pseAejAgQM9kqSvvvpqXHnllXj22WfxzDPPmHfhBhm5z65du6Jr166u11dddRVKSkrw1FNPuYIPo+cMlUCvafXq1WjdujVuuukmj/ZI/T6NiITfzbAEH/fee6/fLH2bzRbQuZOTkwFI0V1KSoqrvayszBXJJScn48KFC/jll188/o+5rKwMgwYNCuhzvem9x//85z/46aefFO8dP35cEXmq2b59O77++musX7/eb98rr7wScXFxKCwsNO1hFar7lKWkpKBTp04oLCwEEJrvEgjNfVZXV2PcuHEoKirChx9+6Her62B8n2ratm0Lq9Wq+L8e998pb8nJyar9GzdujDZt2vjsY+Tvg5kCuU/Z+vXrceedd2LDhg0YOnSoz76NGjXCb3/7W9ff4VCrz326GzhwIF555RXX61j6PoUQePnllzF58mTEx8f77Bvu79OoiPndNC17JMiMJpzm5eW52qqqqlQTTtevX+/qc+TIkbAmnH722Weutk8//VR3guKUKVMUqyK0HDx4UAAQH330UcDXG6j63qfsxIkTIiEhQaxZs0YIEVnfpRCB3+eFCxfETTfdJHr06CHKysp0fVYov8/+/fuLP/zhDx5t3bt395lw2r17d4+26dOnK5LaRo4c6dFnxIgRYU9QNHKfQgixdu1a0aRJE7+JfrKamhrRr18/MXXq1Ppcar0Ecp/ebr75ZpGdne16HSvfpxB1CbYHDx70+xmR8H3KoDPhNBJ+NyM++Pjhhx/E/v37xfz580WLFi3E/v37xf79+0VlZaWrT9euXYXD4XC9Xrx4sUhMTBQOh0McPHhQTJgwQXWpbXp6unj//ffFvn37xHXXXRfWpbZXXHGF2Llzp9i5c6fo1auXYmmm9z0KIUR5eblo1qyZePHFFxXn/Pbbb8X8+fPF7t27RVFRkdiyZYvo1q2b6NOnT1iXoBq5z8rKSvG///u/YseOHaKoqEhs27ZNXHXVVSItLS1iv0shjN9ndXW1uPHGG0V6err4/PPPPZbvVVVVCSHC/33KSxZXrlwpDh06JHJzc0Xz5s1dqwDmzJkjJk+e7OovL+d74IEHxKFDh8TKlSsVy/k++eQTYbVaxeLFi8WXX34pFi9eHDFLM/Xe59q1a0Xjxo3F888/r7kEet68eWLr1q3iu+++E/v37xdTp04VjRs39ghQQ83ofS5dulS8/vrr4ptvvhFffPGFmDNnjgAgNm3a5OoTC9+n7LbbbhMDBgxQPWekfZ+VlZWu5yIA8fTTT4v9+/e7VspF6u9mxAcfU6ZMEQAUf7Zt2+bqA0CsWrXK9bqmpkY8/vjjIjk5WSQkJIhrr71WEcGeO3dO3HvvvSIpKUk0bdpUjB49Wvz4448huitPP//8s5g0aZJo2bKlaNmypZg0aZJiSZv3PQohxF//+lfRtGlT1VoPP/74o7j22mtFUlKSiI+PF5dddpm4//77FTUyQsnofZ49e1YMGzZMtGvXTsTFxYmOHTuKKVOmKL6nSPouhTB+n0VFRap/x93/nkfC9/n888+LTp06ifj4eHHllVd6jLhMmTJFDB482KN/QUGB6NOnj4iPjxc2m001SN6wYYPo2rWriIuLE926dfN4mIWLkfscPHiw6vc2ZcoUV5/c3FzRsWNHER8fL9q1ayeGDRsmduzYEcI7UmfkPvPy8sRll10mmjRpIi655BJxzTXXiC1btijOGe3fpxDSaGrTpk3F8uXLVc8Xad+nPEqj9XcwUn83LULUZpoQERERhUDM1fkgIiKiyMbgg4iIiEKKwQcRERGFFIMPIiIiCikGH0RERBRSDD6IiIgopBh8EBERUUgx+CAiIqKQYvBBREREIcXgg4iIiEKKwQcRERGFFIMPIiIiCqn/D1q2xGN0bZrLAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#测试模型\n",
    "model.eval()#将模型变为测试模式\n",
    "test_inputs = x_train.to(device)\n",
    "predicted_gpu = model(test_inputs)\n",
    "predicted = predicted_gpu.cpu().data.numpy()\n",
    "plt.plot(x_train,y_train,'ro')\n",
    "plt.plot(x_train, predicted, label=\"predict\")\n",
    "plt.legend() #画标签\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "d79f4cc6",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "pytorch",
   "language": "python",
   "name": "pytorch"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
